package com.cwj.lab1;

/**
 * 链式队列
 * 即用单向链表实现的先入先出队列
 *
 * */

public class LinkQueue<T> {
    //链表的结点
    static class Node<T> {
        T val;//数据域
        Node<T> next;//指针域
        //构造函数可以在后面简化代码的信息
        public Node(T val, Node<T> next) {
            this.val = val;
            this.next = next;
        }
    }
    //frt为头指针其指向首元元素，back指向尾元元素
    //无设置头结点
    Node<T> frt, back;
    //有效元素的数目（即结点数目）
    int len;
//构造器：无设置头结点
    public LinkQueue() {
        back = frt = null;
        len = 0;
    }
//加入一个结点，因为我们没有设置头结点，所以其需要进行分类分析
    public void push(T one) {
        if (back == null && frt == null) {
            frt = back = new Node<T>(one, null);
            len += 1;
            return;
        }
        Node<T> nNode = new Node<T>(one, null);
        back.next = nNode;
        back = nNode;
        len += 1;
    }
//和push的情况一样，因为以那个
    public T pop() {
        //即对函数进行提前的判断
        if (len < 1) {
            throw new RuntimeException("队列为空");
        }
        T temp = frt.val;
        //如果进入该判断，那么就意味着该操作后就为空队列了
        if (frt == back) {
            back = null;
        }
        len -= 1;
        frt = frt.next;
        return temp;
    }

    //如果队列为空其回发生空指针异常
    public T front() {
        return frt.val;
    }
    /**
     * 返回队列的队尾元素
     * */
    public T back() {
        return back.val;
    }
//返回len
    public int size() {
        return this.len;
    }

    //是否为空
    public boolean isEmpty() {
        return len <= 0;
    }
}
